package v2;
/**
 * 
 */
import java.awt.Color;
import java.util.ArrayList;

import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction;

/**
 * La classe permettant de creer des dépressions sur un terrain et d'augmenter l'hygrométrie des Parcelles.
 * 
 * @author bosc & dunoyerd
 * @version 0.1
 * @see 
 * @since version 0.1
 */
public class Depression {
	
	// Attributs
	
	/**
	 * La Position ou se trouve actuellement la Depression.
	 * 
	 * @see Depression#Depression(Position,int,int,int)
	 * @see Depression#Depression(int,int,int,int,int)
	 */
	private Position monCentre;

	/**
	 * Le rayon de la Depression: la distance par rapport au centre sur laquelle la Depression agit.
	 * 
	 * @see Depression#Depression(Position,int,int,int)
	 * @see Depression#Depression(int,int,int,int,int)
	 */
	private int monRayon;
	
	/**
	 * La puissance de la depression en son centre
	 * 
	 * @see Depression#Depression(Position,int,int,int)
	 * @see Depression#Depression(int,int,int,int,int)
	 */
	private int monIntensite;
	
	/**
	 * Le type de decroissance des precipitations par rapport au centre de la Depression. (linéaire, logarithmique...)
	 * 
	 * @see Depression#Depression(Position,int,int,int)
	 * @see Depression#Depression(int,int,int,int,int)
	 */
	private int typeDiminution;
	
	/**
	 * La Couleur de la Depression. Cette couleur est fixe.
	 */
	private final Color maCouleur = Color.GRAY;
	
	
	// Constructeurs
	
	/**
	 * Constructeur Depression.
	 * 
	 * Ce constructeur permet de ceer un objet Depression. Il prend une Position en entree, un rayon, une intensite et un type de diminution
	 * 
	 * @param maPos
	 * 				La Position de la Depression.
	 * @param monRay
	 * 				Le rayon des precipitations de la Depression.
	 * @param monInt
	 * 				L'intensite de la Depression.
	 * @param typDim
	 *				Le type de diminution de la Depression
	 * 
	 * @see Depression#maPosition
	 * @see Depression#monRayon
	 * @see Depression#monIntensite
	 * @see Depression#typeDiminution
	 */
	public Depression(Position maPos, int monRay, int monInt, int typDim)
	{
		this.monCentre = maPos;
		this.monRayon = monRay;
		this.monIntensite = monInt;
		this.typeDiminution = typDim;
	}

/*	TODO: inutile --> à supprimer
 * 	*//**
	 * Constructeur Depression.
	 * 
	 * Ce constructeur permet de ceer un objet Depression. Il prend une Position en entree, un rayon, une intensite et un type de diminution
	 * 
	 * @param maPos
	 * 				La Position de la Depression.
	 * @param monRay
	 * 				Le rayon des precipitations de la Depression.
	 * @param monInt
	 * 				L'intensite de la Depression.
	 * @param typDim
	 *				Le type de diminution de la Depression
	 * 
	 * @see Depression#maPosition
	 * @see Depression#monRayon
	 * @see Depression#monIntensite
	 * @see Depression#typeDiminution
	 *//*
	public Depression(int maLigne, int maColonne, int monRay, int monInt, int typDim)
	{
		this.monCentre = new Position(maLigne, maColonne);
		this.monRayon = monRay;
		this.monIntensite = monInt;
		this.typeDiminution = typDim;		
	}*/
	
	// Accesseurs
	
	// "Getteurs"
	
	/**
	 * Retourne la position de la Depression
	 * 
	 * @return la position de la Depression
	 */
	public Position obtientPosition()
	{
		return monCentre;
	}

	/**
	 * Retourne le rayon d'action de ma Depression
	 * 
	 * @return le rayon d'action
	 */
	public int obtientRayon()
	{
		return monRayon;
	}
	
	/**
	 * Retourne l'intensité de la Depression
	 * 
	 * @return l'intensité de la Depression
	 */
	public int obtientIntensite()
	{
		return monIntensite;
	}

	/**
	 * Retourne le type de Diminution de la dépréssion
	 * 
	 * @return le type de Diminution de la Depression
	 */
	public int obtientTypDim()
	{
		return typeDiminution;
	}
	
	/**
	 * Retourne la Couleur de la Depresion (Pour la partie Graphique)
	 * 
	 * @return la couleur de la Depression
	 */
	public Color obtientCouleur()
	{
		return maCouleur;
	}
	
	// "Setteurs"
	
	/**
	 * Assigne une nouvelle Position à la Depression
	 * 
	 * @param maPosition
	 * 				La nouvelle position de la Depression
	 */
	public void assignePosition(Position maPosition)
	{
		this.monCentre = maPosition;
	}

	/**
	 * Assigne un nouveau Rayon à la Depression
	 * 
	 * @param monRayon
	 * 				Le nouveau Rayon de ma Depression
	 */
	public void assigneRayon(int monRayon)
	{
		this.monRayon = monRayon;
	}
	
	/**
	 * Assigne une nouvelle intensité à la Depression
	 * 
	 * @param monIntensité
	 * 				La nouvelle intensité de la Depression
	 */
	public void assigneIntensite(int monIntensite)
	{
		this.monIntensite = monIntensite;
	}
	
	// Méthodes

	/**
	 * Méthode permettant de faire augmenter l'hygrométrie d'une parcelle
	 * utilisé par augmenterHygro(ArrayList<Parcelle> mesParcelles)
	 * 
	 * @param maParcelle la parcelle su laquelle je fais pleuvoir la pluie
	 */
	public void augmenterHygroParcelle(Parcelle maParcelle)
	{
		double distanceCentreDepr = Position.calculDistance(monCentre, maParcelle.obtientMaPosition());
		double tauxHygroTemp = maParcelle.obtientTauxHygro() + this.monIntensite/distanceCentreDepr;
		if(tauxHygroTemp > maParcelle.obtientMonType().maxHygro())
		{
			tauxHygroTemp = maParcelle.obtientMonType().maxHygro();
		}
		maParcelle.assigneTauxHygro((int)(tauxHygroTemp));
	}
	
	/**
	 * Méthode permettant d'augmenter l'hygrométrie sur un ensemble de parcelles
	 * utilisé par Terrain.GenererTour(...)
	 * 
	 * @param mesParcelles la liste des parcelles à portée d'une depression
	 */
	public void augmenterHygro(ArrayList<Parcelle> mesParcelles)
	{
		while(!mesParcelles.isEmpty())
		{
			this.augmenterHygroParcelle(mesParcelles.remove(0));
		}
	}
	
	/**
	 * Methode permettant de generer une representation textuelle de la depression
	 * centre + rayon + intensite + type diminution
	 * 
	 * 
	 * @return la toString de la Depression
	 */
	public String toString()
	{
		String myString = new String("");
		
		myString+=" mon Centre: "+this.monCentre;
		myString+=" mon Rayon: "+this.monRayon;
		myString+=" mon Intensite: "+this.monIntensite;
		myString+=" type Diminution: "+this.typeDiminution;
		
		return myString;
	}
}
